#ifndef MUSICPLAYER_H
#define MUSICPLAYER_H

#include <QWidget>
#include "volumetool.h"
#include "musiclist.h"
#include "commonform.h"
#include "lrcpage.h"
#include <QMediaPlayer>
#include <QPropertyAnimation>
#include <QSqlDatabase>

QT_BEGIN_NAMESPACE
namespace Ui { class MusicPlayer; }
QT_END_NAMESPACE

class MusicPlayer : public QWidget
{
    Q_OBJECT

public:
    MusicPlayer(QWidget *parent = nullptr);
    ~MusicPlayer();
    // 初始化的工作统一放在这里
    void initUi();
    // 初始化数据库
    void initDB();
    // 初始化数据库的数据
    void initData();
    // 初始化播放控制区域的东西
    void initPlayer();
    // 连接信号与槽的工作统一在这里
    void connectSignalsAndSlots();
    // 自动随机推荐图片
    QJsonArray randomRec();

private slots:
    void on_quit_clicked();
    // 更改 page 的槽函数
    void onBtFormClicked(int pageId);

    void on_volume_clicked();

    void on_addLocal_clicked();
    // 点击lrc歌词按钮，弹出歌词lrc界面
    void on_lrcWord_clicked();
    // 处理三个界面是否点击收藏喜欢的槽函数
    void onPageLikeClicked(bool isLike, const QString& musicId);
    // 暂停与播放
    void on_play_clicked();
    // 上一曲
    void on_playUp_clicked();
    // 下一曲
    void on_playDown_clicked();
    // 播放模式的改变
    void on_playMode_clicked();
    // 接收到 CommonForm 传过来的 playAll 的信号的槽函数
    void onPlayAllClicked(PageType type);
    // 播放当前页面的所有 playlist 中的歌曲，默认从第 0 首开始播放
    void playAllMusicOfPage(CommonForm* page, int index = 0);
    // 接收到 CommonForm 传过来的双击歌曲的信号的槽函数
    void onPlayByDoubleClicked(PageType type, int row);
    // 播放当前页面中双击的歌曲
    void playByDoubleClickedMusicOfPage(CommonForm* page, int index);
    // 当播放的歌曲发生改变的时候关联的槽函数，为了实现最近播放功能
    void onCurrentIndexChanged(int index);
    // 接收 VolumnTool 传过来的实现静音非静音切换的槽函数
    void onSetMuted(bool isMuted);
    // 接收 VolumnTool 传过来的实现音量调节的槽函数
    void onSetVolume(int volume);
    // 接收当歌曲切换的时候，总时长要改变的槽函数
    void onDurationChanged(qint64 duration);
    // 接收歌曲播放过程中的时间推进改变的槽函数
    void onPositionChanged(qint64 position);
    // 点击了进度条改变歌曲播放的进度之后，同步歌曲的正在播放的时间的槽函数
    void onMusicSliderChanged(float ration);
    // 当播放的歌曲发生改变的时候，显示的歌曲名称和歌手改变的槽函数
    void onMetaDataAvailableChanged();
    // 点击换肤按钮
    void on_skin_clicked();
    // 点击最小化按钮
    void on_min_clicked();
    // 当程序真正退出的时候调用
    void onMusicPlayerQuit();

protected:
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);

private:
    Ui::MusicPlayer *ui;
    QPoint dragPosition;
    VolumeTool* volume;

    MusicList musicList;
    // 进行播放歌曲控制的
    QMediaPlayer* player;
    // 进行播放列表控制的
    QMediaPlaylist* playlist;
    // 记录当前正在播放的歌曲在媒体列表中的索引
    int currentIndex;
    // 当前的页面
    CommonForm* currentPage;
    // 当前歌曲播放的总时长
    qint64 totalTime;
    // lrcPage 歌词
    LrcPage* lrcPage;
    // lrcPage 的动画
    QPropertyAnimation* animation;
    // 数据库驱动
    QSqlDatabase sqlite;
};
#endif // MUSICPLAYER_H
